5秒でAmazon Linuxを起動して1日で殺すRubyスクリプトを書いた
こんにちは。望月です。
以前、CLIから簡単にAmazon Linuxを起動するための方法を紹介した、以下のようなブログを書きました。
少し思うところがあり、そのスクリプトを改造しました。小ネタです。
問題点
コマンド一発で最新のAmazon Linuxが起動するので自分自身大変重宝しているのですが、一つ問題がありました。それは「あまりに簡単に起動できるので消し忘れる」という点です。消し忘れると当然EC2の課金が発生するのでお財布にダメージがあります。
もともとこのスクリプトを書いたのは「検証したいことが合った時に、さっと確かめるための方法がほしい」という要望が発端でした。そのため、あまり長期間運用することを想定していませんでした。であれば、一定期間経ったら勝手にStopしてくれれば都合が良さそうです。というわけでその要望を満たすために少し改造しました。
実装
コードはGistに置いておきました。使い方は前回からほとんど変わっていないので、動作方法については冒頭のブログを参照して下さい。変更点は2点です。
18行目から24行目の部分で、EC2インスタンス起動時に実行されるuserdataを記述しています。atコマンドを利用して一定時間後にshutdown -h nowを実行するようにしています。デフォルトでは起動時から24時間後、つまり1日後にshutdownコマンドが走ります。stop_afterの値を書き換えれば停止までの時間は自由に調整できます。
stop_after = 60 * 24 userdata =<<EOF #!/bin/sh # stop after a day echo "shutdown -h now" | at now + #{stop_after}minutes EOF [/ruby] <p>35行目〜41行目の、実際にEC2を起動する部分でuserdataを渡すのとともに、<tt> instance_initiated_shutdown_behavior</tt>をTerminateに変更しています。これにより、OS上のshutdownコマンドによって自動的にEC2がTerminateされることになります。</p> resp = ec2.instances.create(image_id: image_id, security_group_ids: [secgroup_id], key_pair: ec2.key_pairs[keypair_name], user_data: userdata, instance_initiated_shutdown_behavior: "terminate", instance_type: "t2.micro", associate_public_ip_address: true)
このスクリプトを利用すると、自動的に1日でTerminateされるので消し忘れでの課金を最小限に抑止することが出来ます。
起動後に気が変わってTerminateされたくなくなったら、SSHでログインした後にsudo at -l 1コマンドを実行すればshutdownコマンドの予定を削除することができます。消し忘れで痛い目を見たことがある(私のような)方はぜひご利用下さい。